<?php

class UsuarioController extends Zend_Controller_Action {

    public function init() {
        X\Permiso::paraController();
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {
        // return;
        X\Permiso::paraAction('Listar.Usuario');
        $usuarios = $this->em->createQueryBuilder()
                        ->select('u.idUsuario')
                        ->addselect('u.nombre')
                        ->addselect('u.username')
                        ->addselect('u.apellido')
                        ->addselect('u.cargo')
                        ->addselect('u.telefono')
                        ->addselect('u.cedula')
                        ->addselect('u.email')
                        ->from('Default_Model_Usuario', 'u')
            ->addselect('u.sexo')
                        ->orderBy('u.nombre', 'asc')
                        ->setFirstResult(0)
                        ->setMaxResults(20)
                        ->getQuery()
                        ->execute();

        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(u.idUsuario)')
                        ->from('Default_Model_Usuario', 'u')
                        // ->join     ('u.profesor',            'p')
                        ->getQuery()
                        ->getSingleScalarResult();


        $departamentos = $this->em->createQueryBuilder()
                        ->select('d.idDepartamento')
                        ->addselect('d.nombreD')
                        ->from('Default_Model_Departamento', 'd')
                        ->orderBy('d.nombreD', 'asc')
                        ->getQuery()
                        ->execute();

        $perfiles = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->addselect('p.nombre')
                        ->from('Default_Model_Perfil', 'p')
                        ->orderBy('p.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        // json
        $this->view->jsondata = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => $cantidad,
                    "rows" => $usuarios
                ));
        $this->view->jsonDepartamentos = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($departamentos),
                    "rows" => $departamentos
                ));
        $this->view->jsonPerfiles = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($perfiles),
                    "rows" => $perfiles
                ));
    }

    public function ajaxEditarAction() {
        X\Permiso::paraAction('Editar.Usuario');
        $codigoUsuario = $this->_request->getPost('codigoUsuario');
        $username = $this->_request->getPost('nombreUsuario');
        $password = $this->_request->getPost('password');
        $email = $this->_request->getPost('email');
        $nombre = $this->_request->getPost('nombre');
        $apellido = $this->_request->getPost('apellido');
        $documento = $this->_request->getPost('documento');
        $telefono = $this->_request->getPost('telefono');
        $cargo = $this->_request->getPost('cargo');
        $sexo = $this->_request->getPost('sexo');
        $configuraciones = $this->_request->getPost('configuraciones');

//          X\Msg::Success('Hola' . $configuraciones);
//        return;
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idUsuario)')
                        ->from('Default_Model_Usuario', 'p')
                        ->where("p.username='" . pg_escape_string($username) . "'")
                        ->andWhere("p.idUsuario<>'" . pg_escape_string($codigoUsuario) . "'")
                        ->getQuery()
                        ->getSingleScalarResult();

        if ($cantidad > 0) {
            X\Msg::Success('Ya existe un usuario con este nombre de usuario.');
            return;
        }


        $usuario = $this->em->find('Default_Model_Usuario', $codigoUsuario);
        $usuario->setUser($username);
        //  $usuario->setNombre($nombre);
        $usuario->setApellido($apellido);
        $usuario->setCedula($documento ? $documento : null);
        $usuario->setTelefono($telefono);
        $usuario->setCargo($cargo);
        $usuario->setEmail($email);
        $usuario->setSexo($sexo);
        if ($nombre) {
            $usuario->setNombre($nombre);
        }

        if ($password) {
            $usuario->setClave(crypt($password, '$6$rounds=5000$t0c4nt4d3nad3ptr25ajg4973$'));
        }

        $perfildep = $this->em->createQueryBuilder()
                        ->select('p.idPerfilDepartamento')
                        ->from('Default_Model_PerfilDepartamento', 'p')
                        ->where("p.usuario='$codigoUsuario'")
                        ->getQuery()
                        ->execute();

        // X\Msg::Success('HOLA '.$cantidad);return;
        foreach ($perfildep as $config) {

            $pd = $this->em->find('Default_Model_PerfilDepartamento', $config['idPerfilDepartamento']);
            $this->em->remove($pd);
        }
        $configuraciones = Zend_Json::decode($configuraciones);
        $perfiles_generales = array();
        $configNormal = array();
        $c=0;
        $d=0;
        foreach ($configuraciones as $config) {
            if ((is_null($config['departamento']) || $config['departamento'] == "(Vacio)")) {
                $flag = true;
                foreach ($perfiles_generales as $perg) {
                    if ($config['perfil'] == $perg) {
                        $flag = false;
                    }
                }
                if ($flag) {
                    $perfiles_generales[] = $config['perfil'];
                    $d++;
                }
            } else {
                $configNormal[] = $config;
            }
        }

        $configFinal = array();
        foreach ($configNormal as $cn) {
            $flag = true;
            foreach ($perfiles_generales as $perg) {
                if ($perg == $cn['perfil']) {
                    $flag = false;
                }
            }
            foreach ($configFinal as $config) {

                if ($config['perfil'] == $cn['perfil'] && $config['departamento'] == $cn['departamento']) {
                    $flag = false;
                }
            }
            if ($flag) {
                $configFinal[] = $cn;
                $c++;
            }
        }
        //X\Msg::Success('General '.$d.' Normal '.$c);return;
        $this->em->persist($usuario);
        foreach ($perfiles_generales as $perg) {

            $perfil = $this->em->find('Default_Model_Perfil', $perg);
            //        X\Msg::Success('Perfil '.$perfil->getNombre());return;
            $perfDep = new Default_Model_PerfilDepartamento();
            $perfDep->setPerfil($perfil);

            $perfDep->setUsuario($usuario);
            $this->em->persist($perfDep);
        }
        $count = 0;
        foreach ($configFinal as $cf) {

            $departamento = $this->em->find('Default_Model_Departamento', $cf['departamento']);
            $perfil = $this->em->find('Default_Model_Perfil', $cf['perfil']);
            //  X\Msg::Success('El Usuario');return;
            $perfDep2[$count] = new Default_Model_PerfilDepartamento();
            $perfDep2[$count]->setPerfil($perfil);
            $perfDep2[$count]->setUsuario($usuario);
            $perfDep2[$count]->setDepartamento($departamento);

            $this->em->persist($perfDep2[$count]);

            $count++;
        }

        $this->em->flush();

        X\Msg::Success('El Usuario ha sido grabado con exito');
        return;


    }

    public function ajaxListarAction() {
        // parametro
        X\Permiso::paraAction('Listar.Usuario');
        $start = $this->_request->getPost("start");
        $limit = $this->_request->getPost("limit");
        $sort = $this->_request->getPost("sort");
        $dir = $this->_request->getPost("dir");

        // paginacion
        $start = isset($start) ? $start : 0;
        $limit = isset($limit) ? $limit : 20;
        $sort = isset($sort) ? $sort : 'nombre';
        $dir = isset($dir) ? $dir : 'asc';
        $pref = 'u.';


        // query
        $usuarios = $this->em->createQueryBuilder()
                        ->select('u.idUsuario')
                        ->addselect('u.nombre')
                        ->addselect('u.username')
                        ->addselect('u.apellido')
                        ->addselect('u.cargo')
                        ->addselect('u.telefono')
                        ->addselect('u.cedula')
                        ->addselect('u.email')
                        ->addselect('u.sexo')
                        ->from('Default_Model_Usuario', 'u')
                        ->orderBy(pg_escape_string($pref . $sort), pg_escape_string($dir))
                        ->setFirstResult(pg_escape_string($start))
                        ->setMaxResults(pg_escape_string($limit))
                        ->getQuery()
                        ->execute();

        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(u.idUsuario)')
                        ->from('Default_Model_Usuario', 'u')
                        ->getQuery()
                        ->getSingleScalarResult();

        // json
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => $cantidad,
            "rows" => $usuarios
        ));
    }

    public function ajaxEliminarAction() {
        // parametro
        X\Permiso::paraAction('Eliminar.Usuario');
        $codigoUsuario = $this->_request->getPost('idUsuario');

        $perfildep = $this->em->createQueryBuilder()
                        ->select('p.idPerfilDepartamento')
                        ->from('Default_Model_PerfilDepartamento', 'p')
                        ->where("p.usuario='$codigoUsuario'")
                        ->getQuery()
                        ->execute();

        //  X\Msg::Success('Cuenta '.$perfildep[0]['']);return;
        foreach ($perfildep as $config) {

            $pd = $this->em->find('Default_Model_PerfilDepartamento', $config['idPerfilDepartamento']);
            $this->em->remove($pd);
        }
        //   X\Msg::Success('Cuenta '.count($codigos));return;
        $usuario = $this->em->find('Default_Model_Usuario', $codigoUsuario);


        $this->em->remove($usuario);

        $this->em->flush();

        // json
        X\Msg::Success('El usuario a sido eliminado con exito');
    }

    public function ajaxCrearAction() {
        X\Permiso::paraAction('Crear.Usuario');
        $username = $this->_request->getPost('nombreUsuario');
        $password = $this->_request->getPost('password');
        $email = $this->_request->getPost('email');
        $nombre = $this->_request->getPost('nombre');
        $apellido = $this->_request->getPost('apellido');
        $documento = $this->_request->getPost('documento');
        $telefono = $this->_request->getPost('telefono');
        $cargo = $this->_request->getPost('cargo');
        $sexo = $this->_request->getPost('sexo');
        $configuraciones = $this->_request->getPost('configuraciones');


        // query
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(p.idUsuario)')
                        ->from('Default_Model_Usuario', 'p')
                        ->where("p.nombre='" . pg_escape_string($username) . "'")
                        ->getQuery()
                        ->getSingleScalarResult();
        if ($cantidad > 0) {
            X\Msg::Success('Ya existe un Usuario con este nombre de usuario.');
            return;
        }

        $configuraciones = Zend_Json::decode($configuraciones);
        $perfiles_generales = array();
        $configNormal = array();
        foreach ($configuraciones as $config) {
            if ((is_null($config['departamento']) || $config['departamento'] == "(Vacio)")) {
                $flag = true;
                foreach ($perfiles_generales as $perg) {
                    if ($config['perfil'] == $perg) {
                        $flag = false;
                    }
                }
                if ($flag) {
                    $perfiles_generales[] = $config['perfil'];
                }
            } else {
                $configNormal[] = $config;
            }
        }

        $configFinal = array();
        foreach ($configNormal as $cn) {
            $flag = true;
            foreach ($perfiles_generales as $perg) {
                if ($perg == $cn['perfil']) {
                    $flag = false;
                }
            }
            foreach ($configFinal as $config) {

                if ($config['perfil'] == $cn['perfil'] && $config['departamento'] == $cn['departamento']) {
                    $flag = false;
                }
            }
            if ($flag) {
                $configFinal[] = $cn;
            }
        }


        $usuario = new Default_Model_Usuario;
        $usuario->setUser($username);
        $usuario->setClave(crypt($password, '$6$rounds=5000$t0c4nt4d3nad3ptr25ajg4973$'));
        $usuario->setNombre($nombre);
        $usuario->setApellido($apellido);
        $usuario->setCedula($documento ? $documento : null);
        $usuario->setSexo($sexo);
        $usuario->setTelefono($telefono);
        $usuario->setCargo($cargo);
        $usuario->setEmail($email);
        $this->em->persist($usuario);
        // $this->em->flush();
        foreach ($perfiles_generales as $perg) {

            $perfil = $this->em->find('Default_Model_Perfil', $perg);
            //        X\Msg::Success('Perfil '.$perfil->getNombre());return;
            $perfDep = new Default_Model_PerfilDepartamento();
            $perfDep->setPerfil($perfil);

            $perfDep->setUsuario($usuario);
            $this->em->persist($perfDep);
        }
        $count = 0;
        foreach ($configFinal as $cf) {

            $departamento = $this->em->find('Default_Model_Departamento', $cf['departamento']);
            $perfil = $this->em->find('Default_Model_Perfil', $cf['perfil']);
            //  X\Msg::Success('El Usuario');return;
            $perfDep2[$count] = new Default_Model_PerfilDepartamento();
            $perfDep2[$count]->setPerfil($perfil);
            $perfDep2[$count]->setUsuario($usuario);
            $perfDep2[$count]->setDepartamento($departamento);

            $this->em->persist($perfDep2[$count]);

            $count++;
        }
        //  X\Msg::Success('hola'.$cf['perfil'].' '.$cf['departamento']);return;
        $this->em->flush();
        X\Msg::Success('El Usuario se ha creado con éxito.');
    }

    public function ajaxDepartamentosAction() {
        $codigoUsuario = $this->_request->getPost("idUsuario");

        $configs = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->addselect('d.idDepartamento')
                        ->from('Default_Model_PerfilDepartamento', 'f')
			   ->join('f.departamento', 'd')
                        ->join('f.perfil', 'p')
                        ->where("f.usuario='$codigoUsuario'")
                        ->getQuery()
                        ->execute();

        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($configs),
            "rows" => $configs
        ));
    }

    public function ajaxPerfilesAction() {
        $codigoUsuario = $this->_request->getPost("idUsuario");
       // X\Permiso::paraAction('Listar.Perfil');
        $configs = $this->em->createQueryBuilder()
                        ->select('p.idPerfil')
                        ->from('Default_Model_PerfilDepartamento', 'f')
		          ->join('f.perfil', 'p')
                        ->where("f.usuario='$codigoUsuario'")
                        ->andWhere("f.departamento IS NULL")
                        ->getQuery()
                        ->execute();
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($configs),
            "rows" => $configs));
    }

}

